其实这篇博客应该放在前几章来介绍, 只是我一直没有用过这个功能. 前几天有朋友在Windows上使用一直没成功, 喊我帮忙调试时才具体的使用到这个功能. 深入了解了之后, 我个人感觉不会考虑使用这个功能, 只是这里介绍一下用法以及一些基础应用, 最后整理下安全性问题.

基本原理

在前面的博客中(OpenSSH系列(五)-跳板机与HTTP代理使用), 我介绍了一种使用跳板机的访问内部机器的方案. 下面要介绍的方案与前面的方案略有不同, 请看下面的一张图:

Forward Agent的基本原理类似是将本地的.ssh目录下的私钥临时拷贝到Jump Server中, 然后可以在Jump Server中访问我们的服务器. 注意这里是类似, 实际上并没有完整的拷贝私钥过来, 但是你所拥有的权限和拷贝过来无异.

随后的所有内容, 均假定Jump ServerLinux机器.

具体的使用

继续以上面的图为例, 在我的电脑中ssh连接Jump Server, 不同的是, 需要增加-A参数:

1
2
> ssh -A JumpServer
(JumpServer) > ssh Server # 这里会自动查找私钥

调试

有问题时, 建议自己先ssh -vvv打印日志来查看问题, 咨询时也最好贴上这个日志.

确认自己是否成功Forward Agent

1
2
(Jump Server):~# echo "$SSH_AUTH_SOCK"
/tmp/ssh-t4qX51rQWm/agent.8014

可以ssh连接跳板机后, 确认当前是否有这个变量. 如果没有, 就要先检查我的电脑中ssh-agent是否已经启动, 比较简单的确认方法是ssh-add -l是否有正常的返回值.

windows启动git bash时自动启动ssh agent

Linux启动forward agent

确认密钥是否增加好

1
2
3
4
5
(Jump Server):~# ssh-add -l
4096 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx corvo@ThinkPad (RSA)
4096 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx corvo@X1C (RSA)
2048 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /home/corvo/.ssh/id_rsa_raspberry (RSA)
2048 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +GpuM20QI /home/corvo/.ssh/id_rsa_github (RSA)

如果这里没有你想要的密钥, 那么需要退出之后, 在本地电脑启动ssh-agent之后, 使用ssh-add添加对应的私钥, ssh连接到jump server

ssh-agent的配置固化

Windows中固化ssh-agent配置

Linux中我一般使用oh-my-zsh, 它有一个ssh-agent的插件, 直接就可以用了, 其他方案你可以自行搜索下.

对比ProxyCommand

从上面的ssh-add的输出来看, 本地中添加到ssh-agent的密钥在Jump Server中均是可以使用的, 而$SSH_AUTH_SOCK这个变量可以直接设置, 也就是说, 如果你的Jump Server是允许多个人访问的, 那么有root权限的用户就可以查找/tmp目录下面的AUTH_SOCK文件, 从而使用你的私钥, 这是一种极不安全的行为.

反观ProxyCommand, 本身并没有拷贝任何数据, 而是利用Jump Server做了一层tcp连接的转发, 甚至Jump Server都无法得知传输的内容, 从安全性上讲, ProxyCommand是一种相对安全的方案.

ProxyCommand除了带来安全性方面的提升, 还拥有一些Forawrd Agent没有的功能, 比如正向代理端口转发, 自定义config文件, 更有趣的是, 它还支持多层Jump Server. 功能性方面, ProxyCommand的功能也相对丰富.